package com.tt.mymap;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.amap.api.maps.AMap;
import com.amap.api.maps.AMapUtils;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private MapView mapView;//存储地图视图
    private TextView info;//显示信息文本
    private FrameLayout b_1_1;//存储布局中的FrameLayout组件。
    private FrameLayout b_1_2;
    private FrameLayout b_1_3;
    private FrameLayout b_1_4;
    private AMap aMap;//存储地图对象
    private TextView b_t_1;//存储布局中的TextView组件
    private TextView b_t_2;
    private TextView b_t_3;
    private TextView b_t_4;
    private TextView b_t_5;
    private LinearLayout blayout;//存储布局中的LinearLayout组件
    private TextView title;//储TextView组件
    private TextView neirong;
    private LatLng selectedPoint1,selectedPoint2; // 用于存储手动选择的点
    private float qianmi = 0; // 用于存储计算出的距离
    private int clickCount = 0; // 用于跟踪点击次数
    private int types[] = new int[]{     //声明并初始化一个整数数组types
            AMap.MAP_TYPE_NAVI,          //导航地图
            AMap.MAP_TYPE_NIGHT,         //夜景地图
            AMap.MAP_TYPE_NORMAL,        //标准地图
            AMap.MAP_TYPE_SATELLITE      //卫星地图
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // 确保父类的初始化工作完成
        setContentView(R.layout.activity_main); // 设置Activity的用户界面
        initView(savedInstanceState); // 自定义方法，用于初始化视图组件和恢复状态
        Distance();
    }

    private void initView(Bundle save) {
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.onCreate(save); // 初始化MapView，并传入save
        if (aMap == null) {
            // 从MapView控件中获取地图对象
            aMap = mapView.getMap();
            // 创建一个地理位置的对象
            LatLng wulumuqi = new LatLng(43.8255, 87.6168);
            // 将地图的视角移动到之前定义的wulumuqi位置
            aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(wulumuqi, 10));
            //调用aMap对象的moveCamera方法，传入CameraUpdateFactory的newLatLngZoom方法生成的CameraUpdate对象，
            // 将地图视角移动到wulumuqi位置，并设置缩放级别为10。
        }
        info = (TextView) findViewById(R.id.info);
        b_1_1 = (FrameLayout) findViewById(R.id.b_1_1);
        //通过调用findViewById方法并传入资源IDR.id.b_1_1，获取
        //布局中的FrameLayout组件，并将其类型转换为FrameLayout，赋值给b_1_1变量。
        b_1_1.setOnClickListener(this);
        //为b_1_1对象设置点击事件监听器，传入当前类的实例this。
        b_1_2 = (FrameLayout) findViewById(R.id.b_1_2);
        b_1_2.setOnClickListener(this);

        b_1_3 = (FrameLayout) findViewById(R.id.b_1_3);
        b_1_3.setOnClickListener(this);

        b_1_4 = (FrameLayout) findViewById(R.id.b_1_4);
        b_1_4.setOnClickListener(this);

        b_t_1 = (TextView) findViewById(R.id.b_t_1);
        b_t_1.setOnClickListener(this);

        b_t_2 = (TextView) findViewById(R.id.b_t_2);
        b_t_2.setOnClickListener(this);

        b_t_3 = (TextView) findViewById(R.id.b_t_3);
        b_t_3.setOnClickListener(this);

        b_t_4 = (TextView) findViewById(R.id.b_t_4);
        b_t_4.setOnClickListener(this);

        b_t_5 = (TextView) findViewById(R.id.b_t_5);
        b_t_5.setOnClickListener(this);

        blayout = (LinearLayout) findViewById(R.id.blayout);
        blayout.setOnClickListener(this);

        //设置高德地图的地图视图的信息窗口适配器{创建了一个匿名内部类，实现了 AMap.InfoWindowAdapter 接口}
        aMap.setInfoWindowAdapter(new AMap.InfoWindowAdapter() {
            @Override
            //返回自定义的信息窗口视图方法
            public View getInfoWindow(Marker marker) {
                return null;
            }//返回默认的信息窗口

            @Override//用于返回自定义信息窗口的内容视图方法
            public View getInfoContents(Marker marker) {
                //创建视图，表示当前的活动，加载的布局文件的资源ID，
                View view = View.inflate(MainActivity.this, R.layout.mapitem, null);
                //从布局文件中获取一个 LinearLayout 控件的引用
                title = (TextView) view.findViewById(R.id.biaoti);
                neirong = (TextView) view.findViewById(R.id.neirong);
                //将marker对象的标题设置为TextView控件的文本内容。
                title.setText(marker.getTitle());
                neirong.setText(marker.getSnippet());
                return view;
            }
        });
    }

    @SuppressLint("NonConstantResourceId")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.b_1_1://如果点击的视图ID是R.id.b_1_1，则执行以下代码块。
                //if检查高德地图上是否有任何屏幕标记
                if (aMap.getMapScreenMarkers().size() > 0) {
                    aMap.clear();//清除所有标记
                    info.setText("小车地图信息");//更新文本信息为"小车地图信息
                } else {
                    Intent intent = new Intent(MainActivity.this, LocationActivity.class);
                    startActivity(intent);
                    //创建一个新的Intent来启动LocationActivity，并启动该活动。
                }
                break;
            case R.id.b_1_2:
                if (blayout.getVisibility() == View.GONE) //如果blayout的可见性状态是不可见
                {
                    blayout.setVisibility(View.VISIBLE);  //让该控件在界面上显示出来
                } else {
                    blayout.setVisibility(View.GONE);       //将其设置为不可见
                }
                break;
            case R.id.b_t_1:
                updataUi(0);//调用updataUi方法并传入0，切换到导航视图
                info.setText("已经切换到导航视图");//然后更新文本信息为"已经切换到导航视图"
                break;
            case R.id.b_t_2:
                updataUi(1);
                info.setText("已经切换到夜景视图");
                break;
            case R.id.b_t_3:
                updataUi(2);
                info.setText("已经切换到标准视图");
                break;
            case R.id.b_t_4:
                updataUi(3);
                info.setText("已经切换到卫星视图");
                break;
            case R.id.b_t_5:
                updataUi(4);
                info.setText("已经切换到交通视图");
                break;
            case R.id.b_1_3:
                if (aMap.getMapScreenMarkers().size() > 0) //如果高德地图上屏幕标记Markers>0
                {
                    aMap.clear();                         //清除地图上的所有标记
                    info.setText("小车地图信息");          //APP下面显示"小车地图信息"
                } else {
                    DrawMaker();//调用DrawMaker方法在地图上添加标记
                    info.setText("1、2、3、4号小车地图标记已完成");
                }
                break;
            case R.id.b_1_4:
                if (aMap.getMapScreenMarkers().size() > 0) {//如果高德地图上屏幕标记Markers>0
                    aMap.clear();
                    info.setText("小车地图信息");
                } else {
                    float d = getCalculatedDistance();
                    //调用getCalculatedDistance方法计算两点之间的距离，并将结果格式化为字符串，附加到文本信息中。
                    info.setText("测得两点间距离" + d + "km");
                }


        }
    }

    private void updataUi(int state) {
        if (state < 4) {
            //根据state的值从types数组中选择一个地图类型，并将其显示为高德地图的地图类型
            aMap.setMapType(types[state]);
            aMap.setTrafficEnabled(false);//将地图的实时交通流量显示功能关闭
        } else {
            aMap.setTrafficEnabled(true);//开启实时交通流量显示
        }
    }

    private void DrawMaker() {
        //创建一个 LatLng对象point，表示地球上的一个地理坐标点
        LatLng point1 = new LatLng(43.8255, 87.6201);
        //在高德地图上添加一个新的标记（创建一个新的MarkerOptions对象|设置标记的标题，显示在信息窗口的顶部|设置标记的摘要，显示在信息窗口的底部|设置标记的图标
        aMap.addMarker(new MarkerOptions().position(point1).title("1号小车").snippet("乌鲁木齐火车站").icon(BitmapDescriptorFactory.fromResource(R.drawable.local1)));
        LatLng point2 = new LatLng(43.8441, 87.4109);
        aMap.addMarker(new MarkerOptions().position(point2).title("2号小车").snippet("新疆工程学院").icon(BitmapDescriptorFactory.fromResource(R.drawable.local2)));
        LatLng latLng3 = new LatLng(43.9020, 87.4873);
        aMap.addMarker(new MarkerOptions().position(latLng3).title("3号小车").snippet("地窝堡国际机场").icon(BitmapDescriptorFactory.fromResource(R.drawable.local3)));
        LatLng latLng4 = new LatLng(43.8256, 87.6341);
        aMap.addMarker(new MarkerOptions().position(latLng4).title("4号小车").snippet("新疆大学").icon(BitmapDescriptorFactory.fromResource(R.drawable.local4)));
    }

    private void addMarkerAt(LatLng point) {
        // 根据点击次数设置标记的标题
        String title = (clickCount == 0) ? "1" : "2";
        if(clickCount==0){
            aMap.addMarker(new MarkerOptions()
                    .position(point)
                    .title(title)
                    .snippet("")
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.local1)));
        }
        else {
            aMap.addMarker(new MarkerOptions()// 添加一个标记到地图上
                    .position(point)
                    .title(title)
                    .snippet("")
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.local2)));
        }
    }

    private void Distance() {
        aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                if (aMap.getMapScreenMarkers().size() < 2) {
                    if (selectedPoint1 == null) {
                        selectedPoint1 = latLng; // 用户第一次点击地图时，获取第一个点的坐标
                        addMarkerAt(selectedPoint1);
                        info.setText("请选择第二个点");
                        clickCount++; // 增加点击次数
                    } else {
                        selectedPoint2 = latLng; // 用户第二次点击地图时，获取第二个点的坐标
                        addMarkerAt(selectedPoint2);
                        float distance = AMapUtils.calculateLineDistance(selectedPoint1, selectedPoint2);
                        qianmi = distance / 1000;
                        info.setText("测得两点间距离: " + qianmi + " km");
                        // 重置 selectedPoint1 以便用户可以再次选择新的点对
                        selectedPoint1 = null;
                        clickCount = 0; // 重置点击次数
                    }
                } else {
                    System.out.println("只能选择两个点。");
                }
            }
        });
    }
    public float getCalculatedDistance() {
        return qianmi;
    }
}